package com.zx.onlineeducation.service.edu.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zx.onlineeducation.common.servicebase.exception.OnlineEducationException;
import com.zx.onlineeducation.common.util.ResultCodeEnum;
import com.zx.onlineeducation.service.edu.entity.SubjectDO;
import com.zx.onlineeducation.service.edu.entity.excel.SubjectData;
import com.zx.onlineeducation.service.edu.service.SubjectService;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * EasyExcel 读取课程分类数据 监听器
 * <p>这个监听器不能被spring管理，要每次读取excel都要new,然后里面用到spring可以构造方法传进去</p>
 *
 * @author 郑雪
 * @since 2022-01-12
 */
@Slf4j
public class SubjectDataListener implements ReadListener<SubjectData> {

    /**
     * 课程分类服务接口
     */
    private SubjectService subjectService;

    /**
     * 构造器私有，不可以直接创建
     */
    private SubjectDataListener() {}

    /**
     * 使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param subjectService 课程分类服务接口
     */
    public SubjectDataListener(SubjectService subjectService) {
        this.subjectService = subjectService;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param subjectData  课程分类Excel表格对象 {@link SubjectData}
     * @param analysisContext 解析的上下文
     */
    @Override
    public void invoke(SubjectData subjectData, AnalysisContext analysisContext) {
        log.info("解析到一条数据：{}", subjectData);
        if (subjectData == null) {
            throw new OnlineEducationException(ResultCodeEnum.EXCEL_NULL_ERROR);
        }

        // 一级分类名称
        String oneSubjectName = subjectData.getOneSubjectName();

        // 二级分类名称
        String twoSubjectName = subjectData.getTwoSubjectName();

        // 添加一级分类
        SubjectDO oneSubjectDO = addOneSubject(oneSubjectName);

        // 二级分类上级ID
        String twoSubjectParentId = oneSubjectDO.getId();

        // 添加二级分类
        addTwoSubject(twoSubjectName, twoSubjectParentId);

    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }

    private SubjectDO addOneSubject(String oneSubjectName) {
        // 根据一级分类名称查询数据库中是否已存在
        QueryWrapper<SubjectDO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title", oneSubjectName);
        queryWrapper.eq("parent_id", "0");
        SubjectDO oneSubjectDO = subjectService.getOne(queryWrapper);
        // 如果不存在
        if (oneSubjectDO == null) {
            // 创建一级分类对象
            oneSubjectDO = new SubjectDO();
            oneSubjectDO.setTitle(oneSubjectName);
            oneSubjectDO.setParentId("0");
            // 将一级分类对象添加到数据中
            subjectService.save(oneSubjectDO);
            log.info("课程二级分类，存储数据库成功！");
        }
        // 如果已存在
        else {
            log.info("课程二级分类，数据库中已存在！");
        }
        // 返回一级分类对象
        return oneSubjectDO;
    }

    private void addTwoSubject(String twoSubjectName, String twoSubjectParentId) {
        // 根据二级分类名称和二级分类上级ID查询数据库中是否已存在
        QueryWrapper<SubjectDO> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("title", twoSubjectName);
        queryWrapper.eq("parent_id", twoSubjectParentId);
        SubjectDO twoSubjectDO = subjectService.getOne(queryWrapper);
        // 如果不存在
        if (twoSubjectDO == null) {
            // 创建二级分类对象
            twoSubjectDO = new SubjectDO();
            twoSubjectDO.setTitle(twoSubjectName);
            twoSubjectDO.setParentId(twoSubjectParentId);
            // 将二级分类对象添加到数据中
            subjectService.save(twoSubjectDO);
            log.info("课程一级分类，存储数据库成功！");
        }
        // 如果已存在
        else {
            log.info("课程一级分类，数据库中已存在！");
        }
    }

}
